﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using InnvoiceActual.Logica.GestorDB;
using InnvoiceActual.Logica.GestorObject;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Logica.GestorObject.Factura;
using InnvoiceActual.Ws.Clientes;


namespace InnvoiceActual.Ws.Facturas
{
    /// <summary>
    /// Lógica de interacción para GenerarFactura.xaml
    /// </summary>
    public partial class GenerarFactura : Window
    {
        //en esta instancia guardo los datos de la factura que estoy creando.
        Facturero _Factura;
        ConfigFactura _configFactura;
        UnicodigoArticulo _uniCodigoFact;


        public GenerarFactura(Facturero mfactura)
        {
            InitializeComponent();

            _Factura = new Facturero();
            _configFactura = new ConfigFactura(); //falta traer la config de las facturas

            //seteo las condiciones de pago
            CondicionDePagoDB _Condiciones = new CondicionDePagoDB();
            cbxCDP.ItemsSource = _Condiciones.obtenerCondicionDePago();

            //seteo los clientes
            ClienteDB _Clientes = new ClienteDB();
            cbxRS.ItemsSource = _Clientes.FacturarCliente();

            _Factura = mfactura; DataContext = _Factura;

            dataGrid.ItemsSource = _Factura.ListaItem;

        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
        }

        private void AplicarEfecto(Window win)
        {
            var objBlur = new System.Windows.Media.Effects.BlurEffect();
            objBlur.Radius = 5;
            win.Effect = objBlur;
        }

        private void QuitarEfecto(Window win)
        {
            win.Effect = null;
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            const string msg = "Está usted seguro que desea salir de la aplicación?";
            const string titulo = "Cerrar la aplicación";
            var result = MessageBox.Show(msg, titulo, MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
        }

        private void btnCliente_Click(object sender, RoutedEventArgs e)
        {
            ventana_cliente();            
        }
        


        private void PassData(ClienteCS sender)
        {
            _Factura.TempCliente = sender;                       
        }


        private void ventana_cliente()
        {
            
            DetalleClienteWS miVentanaCliente = new DetalleClienteWS();
       
            miVentanaCliente.ShowInTaskbar = false;
            miVentanaCliente.Owner = this; AplicarEfecto(this);

            miVentanaCliente.enviarCliente = new DetalleClienteWS.EnviarCliente(PassData);

            miVentanaCliente.ShowDialog();

            //DataContext = _Factura;

            //this.txtRazonSocial.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            //this.txtCodCli.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            
            cbxCDP.SelectedValue =  _Factura.TempCliente.NroCondicionDePago;

            bool?
            resultado = miVentanaCliente.DialogResult;
            if (resultado != null)
            {
                if (resultado == false)
                {
                    QuitarEfecto(this);
                }
            }
        }


        private void btnRegresar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F2":
                    //-------------------
                    break;

                case "F3":
                    txtCantItem.Focus();
                    break;
                case "F5":
                    ventana_cliente();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }


        private void textBox10_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void txtPrecioItem_LostFocus(object sender, RoutedEventArgs e)
        {
            nuevo_Item();               
        }

        private void nuevo_Item()
        {
            IFormatProvider english = new System.Globalization.CultureInfo("en-us");
            try
            {
                if (!string.IsNullOrEmpty(txtCantItem.Text)
                    && !string.IsNullOrEmpty(txtCategoriaItem.Text)
                    && !string.IsNullOrEmpty(txtArticuloItem.Text)
                    && !string.IsNullOrEmpty(txtSubArticuloItem.Text)
                    && !string.IsNullOrEmpty(txtDescripItem.Text)
                    && !string.IsNullOrEmpty(txtPrecioItem.Text)
                    && (_Factura.ListaItem.Count < _configFactura.Renglones)
                    )
                {

                    ItemsFactura _newitem = new ItemsFactura();
                    //carga items a la factura
                    _newitem.Cantidad = Convert.ToDecimal(txtCantItem.Text);
                    _newitem.Codigo_Categoria_Art = Convert.ToInt16(txtCategoriaItem.Text);
                    _newitem.Codigo_Articulo = Convert.ToInt16(txtArticuloItem.Text);
                    _newitem.Codigo_subArticulo = Convert.ToInt16(txtSubArticuloItem.Text);
                    _newitem.DetalleArticulo = txtDescripItem.Text;
                    _newitem.CodigoIva = _uniCodigoFact.Codigo_Alicuota;
                    _newitem.Iva = _uniCodigoFact.Tasa;
                    _newitem.Precio = Convert.ToDecimal(txtPrecioItem.Text, english);

                    Console.WriteLine("valor de Precio: " + _newitem.Precio);

                    _newitem.PrecioTotaL = _newitem.Cantidad * _newitem.Precio;
                    _newitem.CodigoArticulo = _newitem.Codigo_Categoria_Art.ToString() + " - " +
                                              _newitem.Codigo_Articulo.ToString() + " - " +
                                              _newitem.Codigo_subArticulo.ToString();
                    //_newitem.Iva = Convert.ToDecimal(iva);
                    _Factura.ListaItem.Add(_newitem);

                    //limpiar los controles al generar el Item
                    limpiarTextItem();


                    dataGrid.ItemsSource = ""; dataGrid.ItemsSource = _Factura.ListaItem;
                    
                    _Factura.determinaSubtotal();                    
                    
                }
                else
                {
                    MessageBox.Show("faltan completar datos o no se pueden agragar mas Items");

                }
            }
            finally { }
        }


        private void limpiarTextItem()
        {
            txtCantItem.Text = "";
            txtCategoriaItem.Text = "";
            txtArticuloItem.Text = "";
            txtSubArticuloItem.Text = "";
            txtDescripItem.Text = "";
            txtPrecioItem.Text = "";
        }


        //me permite moverme entre los cantroles textBox sin usar el tab
        private void txtCantItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus( new TraversalRequest( FocusNavigationDirection.Next));
            }  
        }

        private void txtCategoriaItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }  
        }

        private void txtArticuloItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }  
        }

        private void txtSubArticuloItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }  
        }

        private void txtDescripItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }  
        }

        private void txtPrecioItem_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }  
        }

        private void txtSubArticuloItem_LostFocus(object sender, RoutedEventArgs e)
        {
            BuscarArticulo();
        }


        private void PassUniCodigo(UnicodigoArticulo sender)
        {
            //faltan los demas atributos de la clase de acoplar.
            _uniCodigoFact = null;
            _uniCodigoFact = sender;
            txtDescripItem.Text = _uniCodigoFact.Descripcion; 
        }


        private void BuscarArticulo()
        {

            if (!string.IsNullOrEmpty(txtCategoriaItem.Text)
                    && !string.IsNullOrEmpty(txtArticuloItem.Text)
                    && !string.IsNullOrEmpty(txtSubArticuloItem.Text)
                    && (_Factura.ListaItem.Count < _configFactura.Renglones)
                    )
            {
                UnicodigoArticulo _unicodigo = new UnicodigoArticulo();
                ItemsFactura _newitem = new ItemsFactura();
                //carga items a la factura
                _newitem.Cantidad = Convert.ToDecimal(txtCantItem.Text);
                _newitem.Codigo_Categoria_Art = Convert.ToInt16(txtCategoriaItem.Text);
                _newitem.Codigo_Articulo = Convert.ToInt16(txtArticuloItem.Text);
                _newitem.Codigo_subArticulo = Convert.ToInt16(txtSubArticuloItem.Text);
                UnicodigoArticuloDB auxUnicodigoDB = UnicodigoArticuloDB.Instance;
                auxUnicodigoDB.enviarUnicodigo = new UnicodigoArticuloDB.EnviarUnicodigoArticulo(PassUniCodigo);
                auxUnicodigoDB.filtroUnicodigo(_newitem);
            }
            else 
            {
                txtCategoriaItem.Focus();
            }
        }





    }
}
